DUNE_CMD := $(if $(wildcard dune/dune.exe),dune/dune.exe,dune)
DUNE ?= $(DUNE_CMD)

DEBUG ?= 0
ifeq ($(DEBUG), 1)
    DBG=
else
    DBG=quiet
endif

WEBDIR = ../webman
WEBDIRMAN = $(WEBDIR)/manual
WEBDIRAPI = $(WEBDIR)/api
WEBDIRCOMP = $(WEBDIRAPI)/compilerlibref

# The "all" target generates the Web Manual in the directories
# ../webman/manual, ../webman/api, and ../webman/api/compilerlibref
all: css js img
	$(DUNE) exec --root=. src/process_manual.exe $(DBG)
	$(DUNE) exec --root=. src/process_api.exe overwrite $(DBG)
	$(DUNE) exec --root=. src/process_api.exe compiler overwrite $(DBG)

$(WEBDIR)/%:
	mkdir -p $@

$(WEBDIRMAN)/manual.css: scss/_common.scss scss/manual.scss | $(WEBDIRMAN)
	sass scss/manual.scss > $(WEBDIRMAN)/manual.css

$(WEBDIRAPI)/style.css: scss/_common.scss scss/style.scss | $(WEBDIRAPI) $(WEBDIRCOMP)
	sass scss/style.scss > $(WEBDIRAPI)/style.css
	cp $(WEBDIRAPI)/style.css $(WEBDIRCOMP)/style.css

css: $(WEBDIRMAN)/manual.css $(WEBDIRAPI)/style.css

# Just copy the JS files:
#
JS_FILES0 := scroll.js navigation.js
JS_FILES1 := $(JS_FILES0) search.js
JS_FILES := $(addprefix $(WEBDIRAPI)/, $(JS_FILES1)) $(addprefix $(WEBDIRCOMP)/, $(JS_FILES1)) $(addprefix $(WEBDIRMAN)/, $(JS_FILES0))

# There must be a more clever way
$(WEBDIRAPI)/%.js: js/%.js | $(WEBDIRAPI)
	cp $< $@

$(WEBDIRMAN)/%.js: js/%.js | $(WEBDIRMAN)
	cp $< $@

$(WEBDIRCOMP)/%.js: js/%.js | $(WEBDIRCOMP)
	cp $< $@

js: $(JS_FILES)

CURL = curl -s
# download images for local use
SEARCH := search_icon.svg
$(WEBDIRAPI)/search_icon.svg: | $(WEBDIRAPI)
	$(CURL) "https://ocaml.org/img/search.svg" > $(WEBDIRAPI)/$(SEARCH)

$(WEBDIRCOMP)/%: $(WEBDIRAPI)/% | $(WEBDIRCOMP)
	cp $< $@

$(WEBDIRMAN)/%: $(WEBDIRAPI)/% | $(WEBDIRMAN)
	cp $< $@

LOGO := colour-logo.svg
$(WEBDIRAPI)/colour-logo.svg: | $(WEBDIRAPI) $(WEBDIRMAN) $(WEBDIRCOMP)
	$(CURL) "https://raw.githubusercontent.com/ocaml/ocaml-logo/master/Colour/SVG/colour-logo.svg" > $(WEBDIRAPI)/$(LOGO)

ICON := favicon.ico
$(WEBDIRAPI)/favicon.ico: | $(WEBDIRAPI) $(WEBDIRMAN) $(WEBDIRCOMP)
	$(CURL) "https://raw.githubusercontent.com/ocaml/ocaml-logo/master/Colour/Favicon/32x32.ico" > $(WEBDIRAPI)/$(ICON)

IMG_FILES0 := colour-logo.svg
IMG_FILES := $(addprefix $(WEBDIRAPI)/, $(IMG_FILES0)) $(addprefix $(WEBDIRCOMP)/, $(IMG_FILES0)) $(addprefix $(WEBDIRMAN)/, $(IMG_FILES0)) 

img: $(WEBDIRAPI)/search_icon.svg $(WEBDIRAPI)/favicon.ico $(WEBDIRCOMP)/search_icon.svg $(WEBDIRCOMP)/favicon.ico $(IMG_FILES)

clean:
	rm -rf $(WEBDIR) src/.merlin _build

.PHONY: distclean
distclean:: clean

distclean::
	rm -rf .sass-cache

# We need Dune and Lambda Soup; Markup.ml and Uutf are dependencies
DUNE_TAG = 2.6.2
LAMBDASOUP_TAG = 0.7.1
MARKUP_TAG = 0.8.2
UUTF_TAG = v1.0.2
RE_TAG = 1.9.0

# Duniverse rules - set-up dune and the dependencies in-tree for CI
duniverse: dune/dune.exe re markup.ml uutf lambdasoup

dune/dune.exe: dune
	cd dune; ocaml bootstrap.ml

GIT_CHECKOUT = git -c advice.detachedHead=false checkout

dune:
	git clone https://github.com/ocaml/dune.git -n -o upstream
	cd dune; $(GIT_CHECKOUT) $(DUNE_TAG)

distclean::
	rm -rf dune

re:
	git clone https://github.com/ocaml/ocaml-re.git -n -o upstream
	cd ocaml-re; $(GIT_CHECKOUT) $(RE_TAG)

distclean::
	rm -rf ocaml-re

lambdasoup:
	git clone https://github.com/aantron/lambdasoup.git -n -o upstream
	cd lambdasoup; $(GIT_CHECKOUT) $(LAMBDASOUP_TAG)

distclean::
	rm -rf lambdasoup

markup.ml:
	git clone https://github.com/aantron/markup.ml.git -n -o upstream
	cd markup.ml; $(GIT_CHECKOUT) $(MARKUP_TAG)

distclean::
	rm -rf markup.ml

uutf:
	git clone https://github.com/dbuenzli/uutf.git -n -o upstream
	cd uutf; $(GIT_CHECKOUT) $(UUTF_TAG)
	cd uutf; \
  mv opam uutf.opam; \
  echo '(lang dune 1.0)' > dune-project; \
  echo '(name uutf)' >> dune-project; \
  echo '(library (name uutf)(public_name uutf)(flags (:standard -w -3-27))(wrapped false))' > src/dune

distclean::
	rm -rf uutf

.PHONY: css js img duniverse
